# -*- coding: utf-8 -*-
# @Author   : zxc19
# @Time     : 2023/7/7 10:17
# @FileName : pretty_allure.py
# @Desc     : 请输入功能模块描述
import functools

import allure
import pytest

from config import settings


class PrettyAllure(object):

    @classmethod
    def pretty_allure_case(cls, page, case_data: dict):
        """
        添加用例相关信息
        :param page:
        :param case_data:
        :return:
        """
        allure.dynamic.feature(case_data.get("module", '未获取到模块'))
        allure.dynamic.story(case_data.get("function", '未获取到方法'))
        allure.dynamic.severity(case_data.get('level', '未获取到级别'))
        allure.dynamic.title(
            f'{case_data.get("case_id", "未获取到用例ID")}_{case_data.get("case_title", "未获取到标题")}')
        if case_data.get("is_run", "Y") != "Y":
            allure.dynamic.description("用例指定跳过")
            pytest.skip("用例指定跳过")

    @classmethod
    def pretty_allure_screen_shot(cls, page, case_data):
        """
        添加截图
        :param page:
        :param case_data:
        :return:
        """
        filename = settings.SCREENSHOT_DIR.joinpath(case_data.get('module')).joinpath(
            case_data.get('function')).joinpath(
            f"{case_data.get('case_id')}.png")
        page.screenshot(path=filename)
        allure.attach.file(source=filename, name=case_data.get('case_title'),
                           attachment_type=allure.attachment_type.PNG)

    @classmethod
    def pretty_allure_wrapper(cls, func):
        """
        装饰器函数
        :param func:
        :return:
        """

        @functools.wraps(func)
        def inner(*args, **kwargs):
            # 添加用例信息
            cls.pretty_allure_case(page=kwargs.get("page"), case_data=kwargs.get("case_data"))  # 如何获取case_data?
            r = func(*args, **kwargs)  # 运行用例
            # 添加截图
            # cls.pretty_allure_screen_shot(page=kwargs.get("page"), case_data=kwargs.get("case_data"))
            return r

        return inner

    @staticmethod
    def pop_no_case_data(case_data):
        """
        弹出非测试数据
        :param case_data:
        :return:
        """
        data = dict(case_data)
        data.pop('case_id')
        data.pop('module')
        data.pop('function')
        data.pop('level')
        data.pop('is_run')
        data.pop('case_title')
        return data
